package util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

import peca.CorPeca;
import peca.Rei;
import util.robo.Robo;
import estrutura.Celula;
import estrutura.Peca;

public class Relatorio {
	
	public static void relatorio(CorPeca cor,  Celula[][] celulas){
		
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
					Celula celula = celulas[x][y]; 
					Peca peca = celula.getPeca();
					if(peca != null && peca.getCor() == cor){
						System.out.println(peca.getNome());
						selecionarJogadasPossiveis(celula, celulas);	
					}
				}
			}
		}
	
	
	/**
	 * TODO Falta implementar
	 * simula resultado jogada
	 * 
	 * @param cor
	 * @param celulas
	 */
	
	public static String simulaJogada(CorPeca cor,  Celula[][] celulas){
		Map<String, Integer> jogadas = new HashMap<String, Integer>();
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
					Celula celula = celulas[x][y]; 
					Peca peca = celula.getPeca();
					if(peca != null && peca.getCor() == cor){
						System.out.println(peca.getNome());
						jogadas.putAll(selecionarJogadasPossiveis(celula, celulas));
					}
				}
			}
			System.out.println(jogadas.values());
			int maior = -1;
			String chave ="";
			 for (Iterator it = jogadas.keySet().iterator(); it.hasNext();) {  
		            String key = String.valueOf(it.next());  
		            int item = jogadas.get(key);		    
		            if(item > maior){
		            	chave = key;		
		            	maior = item;
		            }
			 }
			 
			 if(maior == 0){
				 Random randomico = new Random();
				 int valor = randomico.nextInt(jogadas.size()-1);
				 
				int cont = 0;
				
				 for (Iterator it = jogadas.keySet().iterator(); it.hasNext();) {  
			            chave = String.valueOf(it.next());  
			            if(cont == valor){
			            	break;
			            }
			            cont++;
			            
				 }
			 }
			 
		
			 
			System.out.println("melhor jogada ->" +chave);
			return chave;
			
		}
	
	
	private static Map<String, Integer> selecionarJogadasPossiveis(Celula origem,  Celula[][] celulas){
		Map<String, Integer> jogadas = new HashMap<String, Integer>();
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
				if(origem.getPeca().isMovimentoValido(origem, celulas[x][y], celulas)){
					if(celulas[x][y].getPeca() != null ){
						System.out.println("["+origem.getPosicao()+" "+x+""+y+"]" + "Come:["+celulas[x][y].getPeca().getNome() +"]");
					}else{
						System.out.println("["+origem.getPosicao()+" "+x+""+y+"]");
					}
					jogadas.put(origem.getPosicao()+" "+x+""+y, Robo.pesoJogada(celulas[x][y].getPeca()));
				}
			}
		}
		return jogadas;
	}
	
	
	private static boolean xeque(Celula origem,  Celula[][] celulas){
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
				if(origem.getPeca().isMovimentoValido(origem, celulas[x][y], celulas)){
					if(celulas[x][y].getPeca() != null ){
						if(celulas[x][y].getPeca() instanceof Rei){
							return true;
						}
					}
				}
			}
		}
		return false;
	}
	
	

	public static boolean xeque(CorPeca cor, Celula[][] celulas) {			
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
					Peca peca = celulas[x][y].getPeca();
					if(peca != null && peca.getCor() == cor){
						if(xeque(celulas[x][y], celulas)){
							return true;
						}
					}
				}
			}
		return false;
	}

}
